package main

import "fmt"

// 定义时
// 定义一个函数，生命并实现一个函数
// add是函数名，也是标识符 等价于  var add 函数类型 = 函数体
// (x,y int) 参数列表，可以有 n 个参数，参数是未来调用函数的时候，必须提供的值的占位符，是形式上的占位符，称为形式参数，简称形参
// x、y是形参，有的时候也被称为入参
// 返回值也被称为出参
func add(x, y int /* 形参 */) int /* 返回值列表 */ {
	// 花括号内是函数体，n 条语句，code block
	return x + y // 返回值，可以有，也可以没有，go 还可以有多个
	// return 1 // 和定义的返回值列表一致，个数一致、类型一致
}

func sub() {
	// 无参函数、无返回值
	// go无返回，就代表该函数被调用后没有值可用，不可以赋值、不可以用在传参中
}

// main函数，程序编译好成为一个可执行文件（win .exe, 符合操作系统可执行文件格式要求, 简单认为就是 cpu 未来执行的指令和数据），os 系统加载文件为内存中进程process
// 进程要霸占内存，程序躺在磁盘上编译好的二进制 指令，指令要在 cpu 运行，指令放在进程的内存某个空间中
// 从哪里开始是第一个指令，入口？可执行文件的入口内存地址固定的，c 语言 main 函数的地址
// 简单理解 go 程序，main函数也是入口函数
func main() {
	t := add(4, 5)
	fmt.Println(t) // 第一次调用
	// 调用时
	// add(4, 5) add函数标识符后面加上括号，函数的调用 call，函数的执行
	// (4, 5)传入参数，和定义时的占位符对应，个数一致，类型一致
	// 4和5是穿进去和形式参数对应的实实在在真正的参数，称为实际参数，简称实参
	// 传入实参的过程，称为传参
	fmt.Println(100, 20) // 第二次调用
	// 1、请问函数定义了几次？ 1
	// 2、请问函数调用了几次？ 2
	// 3、一个函数定义好之后可以调用几次? n >= 0
	// 4、请问这 2 次函数调用互相影响吗？大胆可以下一个不准确的猜测: 函数调用一般情况下，互不影响，各自独立

	// fmt.Println(sum()) // 不可以

}
